package com.leyou.page.service;


import com.leyou.common.exception.pojo.ExceptionEnum;
import com.leyou.common.exception.pojo.LyException;
import com.leyou.item.client.ItemClient;
import com.leyou.item.dto.SpecGroupDTO;
import com.leyou.item.dto.SpuDTO;
import com.leyou.item.entity.Brand;
import com.leyou.item.entity.Category;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;

import java.io.File;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class PageService {

    @Autowired
    private ItemClient itemClient;

    @Autowired
    private SpringTemplateEngine templateEngine;

    @Value("${ly.static.itemDir}")
    private String itemDir;

    @Value("${ly.static.itemTemplate}")
    private String itemTemplate;


    /**
     * 加载商品详情页数据
     */
    public Map<String, Object> loadSpuData(Long spuId) {

        //根据spuId查询SpuDto对象
        SpuDTO spuDTO = itemClient.findSpuDtoById(spuId);

        //根据三个分类id的集合查询分类对象的集合
        List<Category> categories = itemClient.findCategorysByIds(spuDTO.getCategoryIds());

        //根据品牌id查询品牌对象
        Brand brand = itemClient.findBrandById(spuDTO.getBrandId());

        //根据cid3查询 规格组集合 且每个规格组对象中要包含当前规格组对于的 规格参数集合
        List<SpecGroupDTO> groupDTOS = itemClient.findSpecGroupDTOSByCid(spuDTO.getCid3());

        Map<String , Object> itemData = new HashMap<>();
        itemData.put("categories",categories);
        itemData.put("brand",brand);///
        itemData.put("spuName",spuDTO.getName());//
        itemData.put("subTitle",spuDTO.getSubTitle());//
        itemData.put("detail",spuDTO.getSpuDetail());//
        itemData.put("skus",spuDTO.getSkus());//
        itemData.put("specs",groupDTOS);//

        return itemData;
    }


    /**
     *生成静态化页面的业务方法
     */
    public void createStaticItemPage(Long spuId){
        //准备静态页面所需要的上下文
        Context context = new Context();
        context.setVariables(loadSpuData(spuId));

        //创建一个静态化页面服务文件对象
        File serverFile = new File(itemDir);
        //指定静态页面的文件名
        String pageName = spuId + ".html";
        //创建一个静态化文件对象
        File pageFile = new File(serverFile, pageName);

        //创建打印流
        try(PrintWriter writer = new PrintWriter(pageFile)) {
            //使用引擎模板生成静态化页面
            templateEngine.process(itemTemplate, context, writer);
        } catch (Exception e) {
            throw new LyException(ExceptionEnum.FILE_WRITER_ERROR);
        }
    }

    /**
     * 上架添加静态页面
     * @param id  必须和消费的生产者中的消息类型一致
     */
    public void addStaticPage(Long id) {
        createStaticItemPage(id);
    }

    /**
     * 下架删除静态页面
     * @param id  必须和消费的生产者中的消息类型一致
     */
    public void deleteStaticPage(Long id) {
        //创建一个静态化页面服务文件对象
        File serverFile = new File(itemDir);
        //指定静态页面的文件名
        String pageName = id + ".html";
        //创建一个静态化文件对象
        File pageFile = new File(serverFile, pageName);
        //判断文件是否存在
        if (pageFile.exists()){
            pageFile.delete();
        }
    }
}
